home *** CD-ROM | disk | FTP | other *** search
- Name MSULKV
- ; Enable use of VAXmate LK250 keyboard under Kermit. Code mostly stolen from
- ; MSLK250.ASM - A simple driver program for the DEC LK250 keyboard on IBM AT's
- ; Original Author: Terry Kennedy, St. Peter's College, Terry@spcvxa.Bitnet.
- ; This version: Trevor Warwick, Digital Equipment Co, Reading, England.
- ; warwick@marvin.enet.dec.com
- ; Edit history
- ; Last edit 5 Apr 1991
- ; 5 Apr 1991 1.0-01 Modify for VAXmate from LK250.ASM
- ; 16 Apr 1991 1.0-02 Add check for VAXmate system using MS-DOS OEM number
- ; 19 Apr 1991 1.0-03 Modify VAXmate check to look for key bytes in system
- ; ROM
- ;
- ; Purpose: Allow access to full set of LK250 keys from Kermit. A set of
- ; key definitions is required, which are appended to the end of
- ; the source below:
- ;
- ; Method: Intercept INT 15 subfunction 50 (Control). If entered via
- ; 50, perform control function as follows:
- ;
- ; AL=00 - Disable substitution (keyboard "Special" [IBM] mode)
- ; AL=01 - Enable sunstitution (keyboard DEC mode)
- ; AL=02 - Send the byte in BL to the keyboard (caution: sending
- ; "random" bytes with this function can lock the key-
- ; board, necessitating a reboot.
- ;
- ;
- ; After this program has been used by KERMIT, the keyboard will be reset to
- ; IBM mode, with any previously selected special modes turned off.
- ;
- ; The code checks that is running on a VAXmate system. If for some reason
- ; this check needs to be bypassed, uncomment the line flagged **HERE** below.
- ;
- ;
- ; Construct final file MSULKV.COM by
- ; masm msulkv;
- ; link msulkv; expect and ignore statement about no stack segment
- ; exe2bin msulkv
- ; ren msulkv.bin msulkv.com rename the result to our runnable filename
- ; del msulkv.exe delete non-runnable intermediate files .exe & .obj
- ; del msulkv.obj
- ;
- ; msulkv run msulkv.com to install the driver
- ;
- ;
- ;
- main group code
- ;
- ;
- ;
- code segment public para 'code'
- assume cs:main,ds:nothing
- ;
- org 100h ; making a.COM file
- ;
- begin: jmp start ; program starts here
- ;
- saved15 dd ? ; previous int 15 vector
- active db 0 ; are we translating?
- ;
- ; This is the new interrupt 15 routine.
- ;
- newi15 proc far
-
- cmp ah,50h ; control function?
- je ctlfnc ; if so...
- ;
- bail: jmp [saved15]
- ;
- ; control functions: enable / disable translation, set LED's, set click
- ; volume, set auto-repeat rate
- ;
- ctlfnc: cmp al,0 ; disable translation?
- jne tst1 ; no
- mov active,al ; else do it
- mov al,00000000b ; clear all bits
- mov ah,0d3h ; KB extensions
- int 16h
- ;
- ; For some reason, the Num Lock LED gets left on, so now manually turn it off
- ;
- mov al,0edh ; set LEDs function
- mov ah,0d5h ; send KB command
- int 16h
- mov al,0 ; LEDs value (all off)
- mov ah,0d5h ; send KB command
- int 16h
- jmp exit ; and exit
- ;
- tst1: cmp al,1 ; enable translation?
- jne tst2 ; no
- mov active,al ; else do it
- mov al,00010001b ; Digital extended, Disable state keys
- mov ah,0d3h ; KB extensions
- int 16h
- jmp exit ; and exit
- ;
- tst2: cmp al,2 ; send to keyboard?
- jne error ; nope, must be an error
- mov al,bl ; byte to [AL] for send
- mov ah,0d5h ; send to KB
- int 16h
- jmp exit ; and exit
- ;
- error: mov ax,0 ; say bad function
- iret ; and exit
- ;
- exit: mov ax,1234h ; say we did it
- iret ; and exit
- ;
- newi15 endp
- ;
- endres label byte ; end of resident code
- ;
- ; Code after here will not remain resident
- ; Cpu test uses DOS's stack [jrd]
- start: ; begin with cpu test [jrd]
- push sp ; push DOS's SP, 8088's push old SP-2
- pop ax ; 286's and higher push old SP
- mov dx,offset main:cpumsg ; prepare bad news message
- cmp ax,sp ; pre versus post push SP's
- jne start0 ; ne = an 8088, sorry 'bout that [jrd]
- mov ax,5000h ; see if we are already loaded
- int 15h ; look for DOS->DEC mode driver
- cmp ax,1234h ; find marker 1234h
- jne start1 ; ne = marker not present, no driver
- mov dx,offset main:errmsg ; say we're already loaded
- start0: mov ah,9
- int 21h
- int 20h ; and bail out
- ;
- ; Check for a VAXmate
- ;
- ; Uncomment the jump to start2 to avoid VAXmate ROM code check
- ;
- start1:
- ; jmp start2 ; un-comment **HERE** to run on anything
- push ds ; save current ds
- mov ax, 0ffffh
- mov ds, ax ; load ds with FFFF
- mov al, ds:000dh ; get byte at FFFF:000D
- cmp al, 0d2h ; if it's D2
- je posvmt ; this might be a VAXmate
- cmp al, 0d3h ; if it's not D3
- jne notvmt ; this isn't a VAXmate
- posvmt:
- mov al, ds:000eh ; get byte at FFFF:000E
- cmp al, 0fch ; if it's FC
- je isvmt ; this is a VAXmate
- notvmt:
- pop ds
- mov dx,offset main:vaxmsg ; say this isn't a VAXmate
- jmp start0
- isvmt:
- pop ds
- ;
- ; End of check for a VAXmate
- ;
- start2: mov ax,3515h ; get existing INT 15 vector
- int 21h
- mov word ptr [saved15],bx ; save it
- mov word ptr [saved15+2],es
- mov dx,offset main:newi15 ; set new INT 15 vector
- mov ax,2515h
- int 21h ; set new vector from DS:DX
- ;
- mov dx,offset main:lodmsg ; say we're loaded
- mov ah,9
- int 21h
- ;
- mov ax,ds:[2ch] ; de-allocate the environment
- mov es,ax ; load envirnoment segment into es
- mov ah,49h ; DOS function number
- int 21h ; free the environment memory
- ;
- mov dx,offset main:endres ; point to end of resident code
- add dx,0fh ; round up
- mov cl,4
- shr dx,cl ; convert to paragraphs (divide by 16)
- mov ax,3100h ; DOS function 31h, error code=0
- int 21h ; terminate and remain resident
- ;
- errmsg: db 0dh,0ah,'MSULKV is already loaded',0dh,0ah,07h,'$'
- lodmsg: db 0dh,0ah,'MSULKV V1.0-03 loaded',0dh,0ah,'$'
- vaxmsg: db 0dh,0ah,'MSULKV requires a VAXmate system',0dh,0ah,'$'
- cpumsg: db 0dh,0ah,'MSULKV requires a 286 (AT) machine or higher'
- db 0dh,0ah,'$' ; wrong cpu type msg [jrd]
- ;
- code ends
- end begin ; start execution at BEGIN
- COMMENT |
- ;
- ;
- ; The following key definitions are required, which should be put in the
- ; user's MSKERMIT.INI file. During terminal emulation, all keys should then
- ; work like on an LK201, with the exception of the "Enter" key, which issues
- ; the same code as "Return". Alt-Enter is used as the key combination to
- ; simulate the LK201 "Enter" key.
- ;
- set key \x1b \KPF1 ; PF1 Esc
- set key \325 \KPF2 ; PF2 Num Lock
- set key \326 \KPF3 ; PF3 Scrl Lock
- set key \311 \KPF4 ; PF4 Prt Sc
-
- SET KEY \339 \Kkpdot ; KP . Delete
- SET KEY \338 \Kkp0 ; KP 0 Install
- SET KEY \335 \Kkp1 ; KP 1 End
- SET KEY \336 \Kkp2 ; KP 2 Down Arrow
- SET KEY \337 \Kkp3 ; KP 3 Page Down
- SET KEY \331 \Kkp4 ; KP 4 Left Arrow
- SET KEY \332 \Kkp5 ; KP 5 unused
- SET KEY \333 \Kkp6 ; KP 6 Right Arrow
- SET KEY \327 \Kkp7 ; KP 7 Home
- SET KEY \328 \Kkp8 ; KP 8 Up Arrow
- SET KEY \329 \Kkp9 ; KP 9 Page up
- SET KEY \330 \Kkpminus ; KP - -
- SET KEY \334 \Kkpcoma ; KP , +
- SET KEY \2494 \Kkpenter ; Alt-Enter (Enter just does Return it seems)
-
- SET KEY \389 \kdecfind ; Find or Home
- SET KEY \390 \kdecinsert ; Insert Here
- SET KEY \391 \kdecremove ; Remove
- SET KEY \392 \kdecselect ; Select or End
- SET KEY \393 \kdecprev ; Previous Screen
- SET KEY \394 \kdecnext ; Next Screen
- SET KEY \395 \Kuparr ; Up Arrow
- SET KEY \396 \Klfarr ; Left Arrow
- SET KEY \397 \Krtarr ; Right Arrow
- SET KEY \398 \Kdnarr ; Down Arrow
-
- SET KEY \315 \Kholdscrn ; F1 Toggle Hold Screen
- SET KEY \316 \Kprtscn ; F2 Print Screen;
- SET KEY \317 \Ktermtype ; F3 Toggle Toggle Terminal Type
- SET KEY \318 \Klogoff ; F4 Turn Session Logging Off
- SET KEY \319 \Kbreak ; F5 Break
-
- set key \x140 \kdecf6
- set key \x141 \kdecf7
- set key \x142 \kdecf8
- set key \x143 \kdecf9
- set key \x144 \kdecf10
- set key \399 \kdecf11
- set key \400 \kdecf12
- set key \401 \kdecf13
- set key \402 \kdecf14
- set key \403 \kdechelp
- set key \404 \kdecdo
- set key \405 \kdecf17
- set key \406 \kdecf18
- set key \407 \kdecf19
- set key \408 \kdecf20
-
- comment shift-return
- set key \796 \13
- comment shift-delete
- set key \782 \127
- |
- ; End of File MSULKV.ASM
-